package ar.edu.utn.frsf.tpae.a2012.g02.models;

import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "cta")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Cuenta {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "cta_id")
	private int idCuenta;

	@Column(name = "cta_nro")
	private long nroCuenta;

	@ManyToOne
	@JoinColumn(name = "cta_cli_id")
	private Cliente cliente;

	@Column(name = "cta_fech_ape")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fechaApertura;

	@Column(name = "cta_sdo_act")
	private double saldoActual;

	@OneToMany(cascade = CascadeType.ALL, mappedBy = "cuenta")
	private List<Movimiento> mivimientos;

	// GETTERS AND SETTERS
	public int getIdCuenta() {
		return idCuenta;
	}

	public void setIdCuenta(int idCuenta) {
		this.idCuenta = idCuenta;
	}

	public long getNroCuenta() {
		return nroCuenta;
	}

	public void setNroCuenta(long nroCuenta) {
		this.nroCuenta = nroCuenta;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Date getFechaApertura() {
		return fechaApertura;
	}

	public void setFechaApertura(Date fechaApertura) {
		this.fechaApertura = fechaApertura;
	}

	public double getSaldoActual() {
		return saldoActual;
	}

	public void setSaldoActual(double saldoActual) {
		this.saldoActual = saldoActual;
	}

	public List<Movimiento> getMivimientos() {
		return mivimientos;
	}

	public void setMivimientos(List<Movimiento> mivimientos) {
		this.mivimientos = mivimientos;
	}

	@Override
	public String toString() {
		return "Cuenta";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((cliente == null) ? 0 : cliente.hashCode());
		result = prime * result + (int) (nroCuenta ^ (nroCuenta >>> 32));
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Cuenta other = (Cuenta) obj;
		if (cliente == null) {
			if (other.cliente != null)
				return false;
		} else if (!cliente.equals(other.cliente))
			return false;
		if (nroCuenta != other.nroCuenta)
			return false;
		return true;
	}
}